package com.cy.jt.security.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;


/**
 * 由@Configuration注解描述的类为spring中的配置类,配置类会在spring
 * 工程启动时优先加载,在配置类中通常会对第三方资源进行初始配置.
 */
@Configuration
//prePostEnabled = true 表示启动权限管理功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
//@Component  //自己写的资源配置类使用的注解
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    /**对http请求的安全控制进行配置*/
    @Override
    public void configure(HttpSecurity http) throws Exception {
        //super.configure(web);
        //1. 关闭跨域攻击
        http.csrf().disable();
        //2. 配置登录url(登录表单使用的是哪个页面)
        http.formLogin()
                //设置登陆页面
                .loginPage("/login.html")
                //设置登陆请求处理地址(对应form表单中的action),登陆时会访问UserDetailService对象
                .loginProcessingUrl("/login")
                //与form表单中input元素的name属性相同可省略
                //.usernameParameter("username")
                //.passwordParameter("password")
                //重定向 设置登陆成功跳转页面(默认为/index.html)
                .defaultSuccessUrl("/index.html");//登录成功的url(redirect)
                //.successHandler(new RedirectAuthenticationSuccessHandler("http://www.baidu.com"))
                //.successHandler(new DefaultAuthenticationSuccessHandler())
                //登陆失败访问的页面（默认为/login.html?error）
                //.failureHandler(new RedirectAuthenticationFailureSuccessHandler("http://www.weibo.com"));
                //.failureHandler(new DefaultAuthenticationFailureHandler());
                //.successForwardUrl("/index.html");//请求转发(服务端跳转)
        http.logout().logoutUrl("/logout").logoutSuccessUrl("/login.html?logout");
        //3. 放行静态资源(放行登陆url 不需要认证就可以访问)
        http.authorizeRequests() //设置请求的授权
                .antMatchers( //配置下列路径的授权
                        "/index.html",

                        "/js/*",
                        "/css/*",
                        "/img/**",
                        "/bower_components/**",
                        "/login.html")//放行的页面
                .permitAll()//允许直接访问
                .anyRequest().authenticated();//除了以上资源必须认证才可访问
        //4. 设置需要认证与拒绝访问的异常处理器
        http.exceptionHandling()
                //没有认证时执行DefaultAuthenticationEntryPoint
                .authenticationEntryPoint(new DefaultAuthenticationEntryPoint())
                //没有授权时执行DefaultAccessDeniedExceptionHandler
                .accessDeniedHandler(new DefaultAccessDeniedExceptionHandler());
    }

    /**
     * 定义SpringSecurity密码加密对象
     * @Bean 注解通常会在@Configuration注解描述的类中描述方法,
     * 用于告诉spring框架这个方法的返回值会交给spring管理,并给spring
     * 管理的这个对象起个默认的名字,这个名字与方法名相同,当然也可以通过
     * @Bean注解起名字
     */
    @Bean //对象名默认为方法名
    //@Bean("bcryptPasswordEncoder")//bean对象名字为bcryptPasswordEncoder
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

}
